package com.liu.email;

import org.apache.commons.mail.EmailAttachment;
import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.MultiPartEmail;
import org.apache.log4j.Logger;

import javax.mail.AuthenticationFailedException;
import javax.mail.MessagingException;
import javax.mail.internet.MimeUtility;
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import java.util.Vector;

/**
 * <p>
 * Title: 使用javamail发送邮件
 * </p>
 * <p>
 * Description: 演示如何使用javamail包发送电子邮件。这个实例可发送多附件
 * </p>
 * <p>
 * Copyright: Copyright (c) 2003
 * </p>
 * <p>
 * Filename: Mail.java
 * </p>
 *
 * @version 1.0
 */
public class MailInfo {
	private static final Logger logger = Logger.getLogger(Mail.class);

	/**
	 * 收件人
	 */
	String to = null;

	/**
	 * 抄送收件人
	 */
	String CC = null;

	/**
	 * 密送收件人
	 */
	String BCC = null;

	/**
	 * 发件人
	 */
	String from = "";

	/**
	 * smtp主机
	 */
	String host = "";

	/**
	 * smtp主机
	 */
	protected String port;

	/**
	 *
	 */
	String username = "";

	/**
	 *
	 */
	protected String password = "";

	/**
	 * 附件文件名
	 */
	protected String filename = "";

	/**
	 * 邮件主题
	 */
	protected String subject = "";

	/**
	 * 邮件正文
	 */
	protected String content = "";

	/**
	 * SMTP服务器是否需要身份验证
	 */
	protected Boolean auth = false;

	/**
	 * 判断是否需要SSL验证
	 */
	protected Boolean ssl = false;

	/**
	 * 用于保存发送附件的文件名的集合
	 */
	protected Vector<String> file = new Vector<String>();

	/**
	 * 超时时间（毫秒）
	 */
	protected int timeout = 10000;

	/**
	 *
	 */
	private boolean debug;


	/**
	 * <br>
	 * 方法说明:发送邮件 <br>
	 * 输入参数: <br>
	 * 返回类型:boolean 成功为true，反之为false
	 *
	 * @throws MessagingException
	 */
	public boolean sendMail() throws MessagingException, AuthenticationFailedException {
		logger.info("get ready to send mail.");
		logger.debug("站点:" + host);
		logger.debug("端口:" + port);
		logger.debug("from:" + from);
		logger.debug("用户名:" + username);
		logger.debug("密码:" + password);
		logger.debug("to:" + to);
		logger.debug("Subject:" + subject);
		logger.debug("Content:" + content);
		logger.debug("needAuth:" + auth);
		logger.debug("ssl:" + ssl);
//    	SimpleEmail email = new SimpleEmail();
//    	email.setSSL(ssl);
//    	email.setHostName(host);
//    	if(ssl){
//    		email.setSslSmtpPort(port);
//    	}else{
//    		email.setSmtpPort(Integer.parseInt(port));
//    	}
//
//    	email.setAuthentication(username,password);   //用户名和密码
//    	try
//        {
//           email.addTo(to); //接收方
//           email.setFrom(from);
//           if(this.CC!=null && !this.CC.equals("") ){
//        	   email.addCc(CC); //抄送方
//           }
//           if(this.BCC!=null && !this.BCC.equals("")){
//        	   email.addBcc(BCC); //秘密抄送方
//           }
//           email.setCharset("GB2312");
//           email.setSubject(subject); //标题
//           email.setMsg(content);   //内容
//           email.send();
//       } catch (EmailException e) {
//           e.printStackTrace();
//           return false;
//       }

		MultiPartEmail multi = new MultiPartEmail();
		try {
			multi.setHostName(host);
			if (ssl) {
				multi.setSslSmtpPort(port);
			} else {
				multi.setSmtpPort(Integer.parseInt(port));
			}
			multi.addTo(to);
			if (this.CC != null && !this.CC.equals("")) {
				multi.addCc(CC); //抄送方
			}
			if (this.BCC != null && !this.BCC.equals("")) {
				multi.addBcc(BCC); //秘密抄送方
			}
			multi.setCharset("GB2312");
			multi.setFrom(from);
			multi.setAuthentication(username, password);
			multi.setSubject(subject);
			multi.setMsg(content);

			if (!file.isEmpty()) {
				Enumeration<String> efile = file.elements();
				while (efile.hasMoreElements()) {
					EmailAttachment attach = new EmailAttachment();
					filename = efile.nextElement().toString(); //选择出每一个附件名
					attach.setPath(filename);
					attach.setDisposition(EmailAttachment.ATTACHMENT);
					try {
						attach.setName(MimeUtility.encodeText(filename, "UTF-8", null));
					} catch (UnsupportedEncodingException e) {
						e.printStackTrace();
					}
					multi.attach(attach);
				}
			}
			multi.send();
		} catch (EmailException e) {
			e.printStackTrace();
			return false;
		}


//        // 构造mail session
//        Properties props = System.getProperties();
//        if(ssl==true){
//	    	  Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
//	    	  final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
//        	  props.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY);
//        	  props.setProperty("mail.smtp.socketFactory.fallback", "false");
//        	  props.setProperty("mail.smtp.socketFactory.port", port);
//        }
//        props.setProperty(" mail.smtp.connectiontimeout", String.valueOf(timeout));
//        props.setProperty("mail.smtp.timeout", String.valueOf(timeout));
//        props.put("mail.smtp.auth", auth.toString());
//        props.put("mail.smtp.host", host);
//  	  	props.setProperty("mail.smtp.port", port);
//        Session session=null;
//        try {
//	        if(auth==false){
//	        	 session = Session.getDefaultInstance(props);
//	        }
//	        else{
//	               session = Session.getDefaultInstance(props,
//	                new Authenticator() {
//	                    public PasswordAuthentication getPasswordAuthentication() {
//	                        return new PasswordAuthentication(username, password);
//	                    }
//	                });
//	        }
//            session.setDebug(debug);
//            MimeMessage msg = new MimeMessage(session);
//            msg.setFrom(new InternetAddress(this.from));
//           //原版  msg.setRecipient(RecipientType.BCC, new InternetAddress(this.to));
//
//
//            //*设置告警发送目的地邮箱地址——zhang*/
//            if(this.to!=null && !this.to.equals("") )
//            		msg.setRecipient(RecipientType.TO, new InternetAddress(this.to));
//
//            //*设置告警抄送目的地邮箱地址——zhang*/
//            if(this.CC!=null && !this.CC.equals("") )
//            		msg.setRecipient(RecipientType.CC, new InternetAddress(this.CC));
//
//            //*设置告警密送目的地邮箱地址——zhang*/
//            if(this.BCC!=null && !this.BCC.equals(""))
//            		msg.setRecipient(RecipientType.BCC, new InternetAddress(this.BCC));
////            msg.setSubject(this.subject);
//            msg.setSubject(this.subject);
//            ////////////////////////////////////////发送附件///////////////////////////////////////
//            Multipart mp = new MimeMultipart();
//            MimeBodyPart mbp = new MimeBodyPart();
//
//            mbp.setContent(MimeUtility.encodeText(this.content, "UTF-8", "B"), "text/html;charset=UTF-8");
//            mp.addBodyPart(mbp);
//            if(!file.isEmpty()){//有附件
//                Enumeration<String> efile=file.elements();
//                while(efile.hasMoreElements()){
//                    mbp=new MimeBodyPart();
//                    filename=efile.nextElement().toString(); //选择出每一个附件名
//                    FileDataSource fds=new FileDataSource(filename); //得到数据源
//                    mbp.setDataHandler(new DataHandler(fds)); //得到附件本身并至入BodyPart
//                    mbp.setFileName(MimeUtility.encodeText(fds.getName(),"UTF-8",null));
////                    mp.addBodyPart(mbp);
//                }
//                mp.addBodyPart(mbp);
//                file.removeAllElements();
//            }
//            msg.setContent(mp); //Multipart加入到信件
//            msg.setSentDate(new Date());
//            msg.setText(this.content);
//
//            msg.saveChanges();
//
//            /*
//             *  由于Session对象中注册了Authenticator子类对象，因此可以直接
//             *  从该Authenticator子类对象中获取登录的相关信息，故直接使用
//             *  Transport 抽象类中静态 send() 方法来简化代码编写
//             */
//        	logger.info("sending mail...");
//            Transport.send(msg);
////            Transport tr = session.getTransport("smtp");
////            tr.connect(host, username, password);
////            msg.saveChanges();      // don't forget this
////            tr.sendMessage(msg, msg.getAllRecipients());
////            tr.close();
//        } catch (AuthenticationFailedException ae) {
//            logger.error("authorize failed！ check your username and password.");
//            throw ae;
//        } catch (MessagingException mex) {
//            mex.printStackTrace();
//            Exception ex = null;
//            if ((ex = mex.getNextException()) != null) {
//                ex.printStackTrace();
//            }
//            throw mex;
//        } catch (IOException e) {
//			e.printStackTrace();
//            return false;
//		}
		return true;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getTo() {
		return to;
	}

	public String getFrom() {
		return from;
	}

	public String getHost() {
		return host;
	}

	public String getSubject() {
		return subject;
	}

	public boolean isDebug() {
		return debug;
	}

	public void setDebug(boolean debug) {
		this.debug = debug;
	}

	public int getTimeout() {
		return timeout;
	}

	public void setTimeout(int timeout) {
		this.timeout = timeout;
	}

	public String getCC() {
		return CC;
	}

	public String getBCC() {
		return BCC;
	}

	public String getFilename() {
		return filename;
	}

	public void setFilename(String filename) {
		this.filename = filename;
	}

	public String getContent() {
		return content;
	}

	/**
	 * @return the port
	 */
	public String getPort() {
		return port;
	}

	/**
	 * @param port the port to set
	 */
	public void setPort(String port) {
		this.port = port;
	}

	/**
	 * @return the ssl
	 */
	public Boolean getSsl() {
		return ssl;
	}

	/**
	 * @param ssl the ssl to set
	 */
	public void setSsl(Boolean ssl) {
		this.ssl = ssl;
	}

	/**
	 * @return the auth
	 */
	public Boolean getAuth() {
		return auth;
	}

	/**
	 * @param auth the auth to set
	 */
	public void setAuth(Boolean auth) {
		this.auth = auth;
	}


	public Vector<String> getFile() {
		return file;
	}

	public void setFile(Vector<String> file) {
		this.file = file;
	}

	/**
	 * 该方法用于收集附件名
	 */
	public void addAttachfile(String fname) {
		file.addElement(fname);
	}



	/**
	 * <br>
	 * 方法说明:设置邮件服务器地址 <br>
	 * 输入参数:String host 邮件服务器地址名称 <br>
	 * 返回类型:
	 */
	public void setHost(String host) {
		this.host = host;
	}

	/**
	 * <br>
	 * 方法说明:设置登录服务器校验密码 <br>
	 * 输入参数: <br>
	 * 返回类型:
	 */
	public void setPassWord(String pwd) {
		this.password = pwd;
	}

	/**
	 * <br>
	 * 方法说明:设置登录服务器校验用户 <br>
	 * 输入参数: <br>
	 * 返回类型:
	 */
	public void setUserName(String usn) {
		this.username = usn;
	}

	/**
	 * <br>
	 * 方法说明:设置邮件发送目的邮箱 <br>
	 * 输入参数: <br>
	 * 返回类型:
	 */
	public void setTo(String to) {
		this.to = to;
	}

	/**
	 * <br>
	 * 方法说明:设置邮件抄送目的邮箱 <br>
	 * 输入参数: <br>
	 * 返回类型:
	 */
	public void setCC(String cc) {
		this.CC = cc;
	}

	/**
	 * <br>
	 * 方法说明:设置邮件密送目的邮箱 <br>
	 * 输入参数: <br>
	 * 返回类型:
	 */
	public void setBCC(String bcc) {
		this.BCC = bcc;
	}

	/**
	 * <br>
	 * 方法说明:设置邮件发送源邮箱 <br>
	 * 输入参数: <br>
	 * 返回类型:
	 */
	public void setFrom(String from) {
		this.from = from;
	}

	/**
	 * <br>
	 * 方法说明:设置邮件主题 <br>
	 * 输入参数: <br>
	 * 返回类型:
	 */
	public void setSubject(String subject) {
		this.subject = subject;
	}

	/**
	 * <br>
	 * 方法说明:设置邮件内容 <br>
	 * 输入参数: <br>
	 * 返回类型:
	 */
	public void setContent(String content) {
		this.content = content;
	}

}
